/*
 * Proyecto Manejador de Proyectos
 * @Autor Hector Hurtado
 */
package Mproyectos.controladores;

import Mproyectos.entidades.*;
import Mproyectos.modelo.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

/**
 * Controla el las transacciones de la entidad proyecto.
 */
@ManagedBean(name = "controlProyectoCRUD")
@SessionScoped
public class ControlProyectoCRUD implements Serializable {

    /**
     * Proyecto en creacion o actualizacion
     */
    private Proyecto proyecto;
    /**
     * Fachada de acceso a los datos
     */
    @EJB
    private FachadaProyecto fachadaProyecto;
    /**
     * Entregable en creación, para adicionar al proyecto.
     *
     */
    private Entregable entregable;
    /**
     * Arreglo de entregables, para adicionar al proyecto.
     *
     */
    private Collection<Entregable> entregables;
    /**
     *
     * Fachada de acceso a los datos delEntregable
     */
    @EJB
    private FachadaEntregable fachadaEntregable;
    /**
     * Palabra Clave en creación, para adicionar al proyecto.
     *
     */
    private PalabraClave palabraClave;
    /**
     * Arreglo de palabras clave, para adicionar al proyecto.
     *
     */
    private Collection<PalabraClave> palabrasClave;
    /**
     *
     * Fachada de acceso a los datos de la palabra clave
     */
    @EJB
    private FachadaPalabraClave fachadaPalabraClave;

    /**
     * Constructor vacio
     */
    public ControlProyectoCRUD() {
    }

    /**
     * Devuelve el Proyecto en creacion o edicion
     *
     * @return Proyecto a crear o actualizar
     */
    public Proyecto getProyecto() {
        // Si el Proyecto esta vacio crear uno 
        if (proyecto == null) {
            proyecto = new Proyecto();
        }
        // Retorna el Proyecto actual
        return proyecto;
    }

    /**
     * Actualiza el Proyecto en edicion o creacion
     *
     * @param Proyecto actual
     */
    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    /**
     * Devuelve todos los Proyectos registrados en el sistema
     *
     * @return Lista de Proyectos
     */
    public Collection<Proyecto> getProyectos() {
        return getFachadaProyecto().listar();
    }

    /**
     * Adiciona a la unidad de persistencia el Proyecto actual
     *
     * @return Nombre de la pagina despues de crear
     */
    public String crear() {
// Adiciona el Proyecto 
        
        for (PalabraClave pc : palabrasClave) {
            pc.getProyectos().add(proyecto);
        }
        getProyecto().setPalabrasClave(palabrasClave);
        getProyecto().setEntregableUbicacion(getEntregables());
        getFachadaProyecto().adicionar(getProyecto());
        proyecto = null;
        // Se va para la pagina de listar Proyectos 
        return "listadoGeneral";
    }

    /**
     * Elimina el Proyecto especificado y retorna a la lista
     *
     * @param Proyecto a eliminar
     * @return Pagina a la quer se devuelve
     */
    public String eliminar(Proyecto proyecto) {
        getFachadaProyecto().eliminar(proyecto);
        return "listar";
    }

    /**
     * Asigna el Proyecto especificado como el Proyecto actual y llama a la
     * pagina de actualizar
     *
     * @param Proyecto a actualizar
     * @return devuelve a la pagina de actualizacion
     */
    public String prepararActualizar(Proyecto proyecto) {
        // Asigna el Proyecto seleccionado desde la lista como  el actual 
        this.setProyecto(proyecto);
        return "actualizar";
    }

    /**
     * Actualiza los datos del Proyecto actual
     *
     * @return devuelve a la lista
     */
    public String actualizar() {
        getFachadaProyecto().actualizar(getProyecto());
        return "listar";
    }

    /**
     * Retorna la fachada de Proyecto
     *
     * @return Fachada de Proyecto
     */
    public FachadaProyecto getFachadaProyecto() {
        return fachadaProyecto;
    }

    /**
     * Fachada de acceso a los datos
     *
     * @param fachadaProyecto the fachadaProyecto to set
     */
    public void setFachadaProyecto(FachadaProyecto fachadaProyecto) {
        this.fachadaProyecto = fachadaProyecto;
    }

    /**
     * Entregable en creación, para adicionar al proyecto.
     *
     * @return the entregable
     */
    public Entregable getEntregable() {
        // Si el Entregable esta vacio crear uno 
        if (entregable == null) {
            entregable = new Entregable();
        }

        // Retorna el Entregable actual
        return entregable;
    }

    /**
     * Entregable en creación, para adicionar al proyecto.
     *
     * @param entregable the entregable to set
     */
    public void setEntregable(Entregable entregable) {
        this.entregable = entregable;
    }

    /**
     * Fachada de acceso a los datos delEntregable
     *
     * @return the fachadaEntregale
     */
    public FachadaEntregable getFachadaEntregable() {
        return fachadaEntregable;
    }

    /**
     * Fachada de acceso a los datos delEntregable
     *
     * @param fachadaEntregale the fachadaEntregale to set
     */
    public void setFachadaEntregable(FachadaEntregable fachadaEntregable) {
        this.fachadaEntregable = fachadaEntregable;
    }

    /**
     * Adiciona a la colección de entregables del Proyecto actual el entregable
     * creado
     *
     * @return Nombre de la pagina despues de crear
     */
    public void addEntregable() {
        /*
         * Adiciona el entregable al una colletion para luego adicionar 
         * esta al proyecto
         */
        getFachadaEntregable().adicionar(getEntregable());
        this.getEntregables().add(getEntregable());
        this.setEntregable(null);
        
    }

    /**
     * Entregable en creación, para adicionar al proyecto.
     *
     * @return the entregables
     */
    public Collection<Entregable> getEntregables() {
        if (entregables == null) {
            entregables = new ArrayList();
        }
        
        return entregables;
    }

    /**
     * Entregable en creación, para adicionar al proyecto.
     *
     * @param entregables the entregables to set
     */
    public void setEntregables(Collection<Entregable> entregables) {
        this.entregables = entregables;
    }

    /*
     * lista de  los tipos de entregables para la seleccion.
     * tanto para busqueda o el registro, .
     * @return the ArrayList de tipos de entregables
     */
    public ArrayList<String> listaTiposEntregables() {
        ArrayList<String> tiposEntregables = new ArrayList();
        tiposEntregables.add("CD");
        tiposEntregables.add("Documento");
        return tiposEntregables;
    }

    /**
     * @return the palabraClave
     */
    public PalabraClave getPalabraClave() {
        if (palabraClave == null) {
            palabraClave = new PalabraClave();
        }
//        System.out.println("ESTOY EN EL GET DE PALABRA CLAVE Y SOY: " + palabraClave);
        return palabraClave;
    }

    /**
     * @param palabraClave the palabraClave to set
     */
    public void setPalabraClave(PalabraClave palabraClave) {

//        System.out.println("ESTOY EN EL SET DE PALABRA CLAVE Y SOY: " + palabraClave);
        this.palabraClave = palabraClave;
    }

    /**
     * @return the palabrasClave
     */
    public Collection<PalabraClave> getPalabrasClave() {
        if (palabrasClave == null) {
            palabrasClave = new ArrayList();
        }
        return palabrasClave;
    }

    /**
     * @param palabrasClave the palabrasClave to set
     */
    public void setPalabrasClave(Collection<PalabraClave> palabrasClave) {
        this.palabrasClave = palabrasClave;
    }

    /**
     * @return the fachadaPalabraClave
     */
    public FachadaPalabraClave getFachadaPalabraClave() {
        return fachadaPalabraClave;
    }

    /**
     * @param fachadaPalabraClave the fachadaPalabraClave to set
     */
    public void setFachadaPalabraClave(FachadaPalabraClave fachadaPalabraClave) {
        this.fachadaPalabraClave = fachadaPalabraClave;
    }

    /**
     * Adiciona a la colección de entregables del Proyecto actual el entregable
     * creado
     *
     * @return void
     */
    public void addPalabraClave() {

        /*
         * Adiciona la palabra Clave al una colletion para luego adicionar 
         * esta al proyecto
         */
        
        if (getFachadaPalabraClave().buscar((palabraClave.getPalabra())) == null) {
            getFachadaPalabraClave().adicionar(palabraClave);
        }
        
        if (!getPalabrasClave().contains(palabraClave)) {
            this.getPalabrasClave().add(palabraClave);
           // palabraClave.getProyectos().add(proyecto);
            getFachadaPalabraClave().actualizar(palabraClave);
        }
        this.setPalabraClave(null);
        
    }
}
